My linkedin | גדעון קוך | GK10 |
פורומים |
קוד לאתרים |
טכנולוגיות אינטרנט |
בנה תיק עבודות |
Photo by Glenn Carstens-Peters
on Unsplash
מאגרי מידע יחסיים מאחסנים נתונים בצורה טבלאית עם שורות ועמודות שכותרתו. למרות שמאגרי מידע יחסיים בדרך כלל מספקים פיתרון הגון לאחסון נתונים, מהירות ומדרגיות עשויים להיות בעיה במקרים מסוימים. SQL (Structured Query Language) משמש לרוב מערכות ניהול מסדי הנתונים היחסיות לניהול מסדי נתונים המאחסנים נתונים בצורה טבלאית.
NoSQL מתייחס לתכנון מסדי נתונים שאינו SQL או שאינו יחסי. זה עדיין מספק דרך מסודרת לאחסון נתונים אך לא בצורה טבלאית. שים בצד את הדאגה למהירות ולהרחבה, מאגרי SQL ו- NoSQL מספקים דרכים תכליתיות ויעילות לשאילתת נתונים. זה חובה עבור מסד נתונים מכיוון שלנגישות יש חשיבות מכרעת גם כן.
במאמר זה אסקור 8 דוגמאות המדגימות כיצד לבצע שאילתות על מסד נתונים של SQL ו- NoSQL. הדוגמאות יכסו כיצד:
• שאילתא עם סינון
• הכנס פריטים חדשים
• עדכן פריטים קיימים
• יישום פונקציות צבירה
אשלים את אותן המשימות בשני מסדי הנתונים כדי שנוכל לראות את ההבדלים והדמיון. אני אשתמש ב- MySQL עבור SQL ו- MongoDB עבור NoSQL.
לפני שמתחילים בדוגמאות, אסביר בקצרה כיצד מאוחסנים נתונים ב- SQL וב- NoSQL.
SQL מאחסן נתונים בצורה טבלאית עם שורות ועמודות.המבנים הנפוצים המותאמים על ידי מסדי נתונים NoSQL לאחסון נתונים הם צמדי ערך מפתח, עמודות המאוגדות במסמך. MongoDB שומר נתונים כמסמכים. מסמך ב- MongoDB מורכב מזוגות ערך שדה.
המסמכים מאורגנים במבנה הנקרא "אוסף". כאנלוגיה, אנו יכולים לחשוב על מסמכים כשורות בטבלה ואוספים כטבלאות. יצרתי טבלה פשוטה ב- MySQL ואוסיף ב- MongoDB עם אותם נתונים המכילים תכונות של מכוניות מסוימות ומחיריהן.
הסבר | SQL | NoSQL |
---|
|
{
"_id" : ObjectId("600c63cf32e0e6419cee81ab"),
"year" : "2017", "make" : "ford", "color" : "black", "km" : 34000, "price" : 28000 } |
מאחר ויש יותר ממכונית אחת כזו השתמשתי ב-limit |
Will result:
|
> db.car.find( {make: "ford"} ).limit(1).pretty()
Will result: { "_id" : ObjectId("600c63cf32e0e6419cee81af"), "year" : "2017", "make" : "ford", "color" : "black", "km" : 34000, "price" : 2800 } |
mysql> select * from car where make = "ford" and year =
"2017" Will result:
|
Will result: { "_id" : ObjectId("600c63cf32e0e6419cee81af"), "year" : "2017", "make" : "ford", "color" : "black", "km" :34000, "price" : 280000 } |
שאילתת האיחזור מקבלת את הפעולה "in" כדי שנוכל לציין את התנאים הדומים ל- NoSQL. |
mysql> select * from car
where make in ("ford","hyundai") and year = "2017" Will result:
|
Will result: { "_id" : ObjectId("600c626932e0e6419cee81a7"), "year" : "2017", "make" : "hyundai", "color" : "white", "km" : 22000, "price" : 32000 } { "_id" : ObjectId("600c63cf32e0e6419cee81ab"), "year" : "2017", "make" : "ford", "color" : "black", "km" : 34000, "price" : 28000 } |
הפונקציה "הכנס לתוך" משמשת להוספת שורה חדשה לטבלה. בניגוד ל- NoSQL, איננו צריכים לכתוב את שמות העמודות. עם זאת, סדר הערכים חייב להתאים לסדר העמודות בטבלה |
mysql> insert into car values
("2017", "bmw", "silver", 28000, 39000) Will result: Query OK, 1 row affected (0.03 sec) |
> db.car.insertOne(
... {year: "2017", make: "bmw", color: "silver",km: 28000, price: 39000} Will result: { br>"acknowledged" : true, "insertedId" : ObjectId("600c6bc79445b834692e3b91") } |
עלינו להשתמש בפרמטר multi:true כדי לעדכן את כל המסמכים העומדים בתנאי הנתון. אחרת, רק מסמך אחד מתעדכן. |
mysql> update car
set make = "BMW"
where make = "bmw" Will result: Query OK, 5 rows affected (0.05 sec) Rows matched: 2 Changed: 2 Warnings: 0 |
> db.car.update( { make: "ford" }, { $set: { make: "BMW"} }, { multi: true } ) Will result: WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 }) |
תחילה אנו מקבצים את המסמכים המבוססים על מותגים על ידי בחירה באפשרות "make$" כמזהה. החלק הבא מציין הן את פונקציית הצבירה שהיא "$ ממוצע" במקרה שלנו והן את השדה שצריך לצרף בעת בחירת העמודה אם אתה מכיר את Pandas , התחביר דומה למדי לפונקציה groupby. הקבוצה לפי סעיף משמשת לקיבוץ השורות על בסיס קטגוריות בעמודה הנתונה. |
mysql> select make, avg(price)
from car
group by make Will result:
|
> db.car.aggregate([ { $group: { _id: "$make", avg_price: { $avg: "$price" }}} ]) Will result: { "_id" : "hyundai", "avg_price" : 36333.333333333336 } { "_id" : "BMW", "avg_price" : 47400 } { "_id" : "ford", "avg_price" : 35333.333333333336 } |
mysql> select make, avg(price)
from car
where year = "2019"
group by make Will result:
|
> db.car.aggregate([ { $match: { year: "2019" }}, { $group: { _id: "$make", avg_price: { $avg: "$price" }}} ]) Will result: { "_id" : "BMW", "avg_price" : 53000 } { "_id" : "ford", "avg_price" : 42000 } { "_id" : "hyundai", "avg_price" : 41000 } |
מבנה מסמכים מבוסס NoSQL אינו רק שינוי במבנה
מסד נתונים אלא מהפך של ממש בביזור מערכי הנתונים עם
טיפול נדרש בעיקביות ומתן זמינות ויכולת עיבדו גבוהים הרבה יותר על מפת האינטרנט הגלובאלית.
באמצעות הגדרת מסדי נתונים המאפשרים הפצה של מסדי הנתונים על גבי מספר רב של שרתים כדי לספק זמינות גבוהה למשתמשים
רבים בעולם. כמו כן מאפשר מסד נתונים
זה, גידול אופקי ואנכי לא מוגבלים במחיר נמוך. יכולות
אלו דוחפות ארגונים רבים להקים את מערכי המידע אירגוניים כמו גם
אתרי מסחר, שיתוף מידע וחברה בהתבסס על מסדי נתונים אלו. |
ביזור מערכי מסדי נתונים פעול על תשתית האינטרנט הרחבה וכדי לבצע יישום של הרחבת מסדי הנתונים לפעילות רחבת היקף בעולם הגלובאלי יש צורך להבין לעומק נושאים נוספים וביניהם: תקשורת, העברת מידע, ערוצי תשתית, הפצה באינטרנט, טכנולוגיות הפצה, תיזמון והיערכות לעקביות בסוף היום. חשוב להבין שתחום ניתוח אפיון ועיצוב מערכות מידע, שונה לחלוטין מזה שהתקיים לפני כעשור. ואיפיון כולל כיום הצגת חלופות אפשריות, הכוללות: SQL, NoSQL, NewSQL . יש צורך להתאים את אפיון המערכת לנושאי האינטרנט, לריבוי המשתמשים, לעוצמות המחשוב, לביזור השרתים, התקשרות ביניהם ולהתאים אותם למסדי מסמכים (BASE) בשילוב טבלאות (ACID) ולבצע עליהם שאילתות, הוספה, עידכון ומחיקה גלובלאיות. |
Join me on LinkedIn All rights reserved Gideon Koch 1998-2024 |